perm filename CHK[AP,SYS] blob
sn#091900 filedate 1974-03-20 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00011 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 Definitions.
C00003 00003 Storage allocations.
C00005 00004 Beginning of main program.
C00007 00005 Read in data files.
C00010 00006 Continue reading in the data files.
C00012 00007 Main loop.
C00016 00008 Mark all slots pointed to from INDEX.
C00018 00009 Subroutines: MARK,PRINT,ERROR.
C00020 00010 Subroutines: CKMLT,CKMLT2,CKLNKS.
C00022 00011 MRKFRE
C00024 ENDMK
C⊗;
;Definitions.
TITLE CHK
EXTERN DDT,$I,JOBREL,JOBFF,JOBSA,JOBDDT
EXTS←←0 ;SET THIS NONZERO TO BE ABLE TO SPECIFY NON-STANDARD EXTENSIONS FOR FILES
F←←0
AC1←1
AC2←2
AC3←3
AC4←4
DICTWD←5
LAST←6
NEXT←7
CNT←10
ADR←11
QUO←12
REM←13
BPTR←14
MULT←15
MULT1←16
P←17
CR←←15 LF←←12
;LEFT HALF FLAGS
CON←←400000
REE←←200000
CONDDT←←100000 ;AUTOMATICALLY ENTER DDT UPON ERROR
LOC 124
REENT
LOC
DEFINE ERRMSG(MSG,INS)
{JRST [OUTSTR [ASCIZ\MSG \]
PUSHJ P,ERROR
INS ]}
DEFINE ERRXIT(MSG)
{JRST [OUTSTR [ASCIZ\
ARGGGGG!!!
MSG
\]
CALLI 1,12]}
;Storage allocations.
PDLEN←←40
PDLIST: BLOCK PDLEN
DICT: XWD DICTWD,0
XWD DICTWD,0
XWD DICTWD,0
BACK: XWD MULT,0
LINKS: XWD NEXT,0
XWD NEXT,0
LNKADR: XWD ADR,0
XWD ADR,0
WORDS: XWD AC1,0
INDEX: XWD DICTWD,0
USETBL: XWD AC1,0
DSK17: 17
SIXBIT /DSK/
0
CMD: BLOCK 2
USEF: SIXBIT /USE2/
SIXBIT /DAT/
BLOCK 2
DICTF: SIXBIT /DICT/
BLOCK 3
LINKSF: SIXBIT /LINKS/
BLOCK 3
WORDSF: SIXBIT /WORDS/
BLOCK 3
INDEXF: SIXBIT /INDEX/
BLOCK 3
ERRORF: SIXBIT /ERRORS/
BLOCK 3
DIGITS: BLOCK 5
SLINKS: 0 ;SIZE OF THE LINKS FILE
TBLSIZ: 0 ;SIZE OF USETBL
USEEND: 0
SAVEAC: 0
SDICT: 0 ;SIZE OF THE DICT FILE
MINMLT: 0 ;SMALLEST MULT PTR FOUND
MLTSTT: 0 ;RELATIVE LOCATION OF START OF MULT PART OF DICT
LOCMIN: 0 ;DICT ENTRY CORRESPONDING TO MINMLT
PT: 0
.+1
ASCIZ\TY ERRORS.*/L
DI ERRORS.*/FU
G CHK
REE
\]
SPECS←←4
XSIZE←←3
MAXNBR←←=500
XLEN←←XSIZE*MAXNBR+SPECS
;Beginning of main program.
CHK: TDZA F,F
REENT: MOVSI F,REE
RESET
MOVE P,[IOWD PDLEN,PDLIST]
OUTSTR [ASCIZ/
/]
HRRZ AC2,JOBFF
CALLI AC2,11 ;CORE
ERRXIT {CORE UUO FAILED: RESET}
TLOE F,REE
JRST NOERRC
OPEN 17,DSK17
ERRXIT {OPEN FAILED ON DSK: ERRORS}
SETZM ERRORF+3
LOOKUP 17,ERRORF
TLZ F,REE
RELEAS 17,
TLNN F,REE
JRST NOERRS
PTWRS7 PT
EXIT
NOERRS: OUTSTR [ASCIZ/NO ERRORS
/]
NOERRC: OPEN 17,DSK17
ERRXIT {OPEN FAILED ON DSK}
SETZM USEF+3
LOOKUP 17,USEF
JRST [ OUTSTR [ASCIZ/File not found: USE2.DAT
/]
JRST NOUSE]
SKIPN USEF+3
OUTSTR [ASCIZ/Zero word count: USE2.DAT
/]
NOUSE: RELEAS 17,
SETZ AC2,
IFE EXTS<JRST PUTEX1>
MOVE BPTR,[POINT 6,AC2]
OUTSTR [ASCIZ /EXTS? /]
MOVEI CNT,3
NXCH: INCHRW AC1
CAIN AC1,CR
JRST PUTEXT
CAIN AC1,LF
JRST PUTEX1
SOJL CNT,NXCH
TRZ AC1,40
TRZE AC1,100
TRO AC1,40
IDPB AC1,BPTR
JRST NXCH
PUTEXT: INCHRW AC1 ;READ THE LF AFTER THE CR
PUTEX1: MOVEM AC2,DICTF+1
MOVEM AC2,LINKSF+1
MOVEM AC2,WORDSF+1
;Read in data files.
AGAIN1: OPEN 1,DSK17
ERRXIT {CANT OPEN THE DSK: DICT}
SETZM DICTF+3
LOOKUP 1,DICTF
JRST [RELEAS 1,
OUTCHR ["-"]
MOVEI AC1,1
CALLI AC1,31 ;SLEEP
JRST AGAIN1]
OUTSTR [ASCIZ /+
/]
HLRE AC1,DICTF+3
TRNE AC1,177
ERRMSG {DICT DOES NOT END ON RECORD BOUNDARY},JRST .+1
MOVNM AC1,SDICT ;save size of DICT file
MOVE AC2,JOBREL
HRRZM AC2,CMD
HRLM AC1,CMD
ADDI AC2,1
HRRM AC2,DICT ;set up DICT indirect pointers
ADDI AC2,1
HRRM AC2,DICT+1
ADDI AC2,1
HRRM AC2,DICT+2
HRRM AC2,BACK
SUBI AC2,2 ;readjust AC2 to pt to first wd of DICT
SUB AC2,AC1
HRRM AC2,LINKS ;set up LINKS indirect ptr
CALLI AC2,11 ;CORE
ERRXIT {CORE UUO FAILED: DICT}
IN 1,CMD
JRST .+2
ERRXIT {IN UUO FAILED: DICT}
RELEAS 1,
OPEN 1,DSK17
ERRXIT {CANT OPEN THE DSK: LINKS}
SETZM LINKSF+3
LOOKUP 1,LINKSF
ERRXIT {LOOKUP FAILED: LINKS}
HLRE AC1,LINKSF+3
MOVNM AC1,SLINKS ;save size of LINKS file
HRRZ AC2,LINKS
AOS LINKS ;correct LINKS indirect ptr
HRRM AC2,LINKS+1 ;SET UP LINKS+1 INDIRECT PTR
AOS LINKS+1 ; AND CORRECT IT
AOS LINKS+1
HRRM AC2,LNKADR
AOS LNKADR
HRRM AC2,LNKADR+1
AOS LNKADR+1
AOS LNKADR+1
HRRZM AC2,CMD
HRLM AC1,CMD
SUB AC2,AC1
HRRM AC2,WORDS ;set up WORDS indirect ptr
CALLI AC2,11 ;CORE
ERRXIT {CORE UUO FAILED: LINKS}
IN 1,CMD
JRST .+2
ERRXIT {IN UUO FAILED: LINKS}
RELEAS 1,
;Continue reading in the data files.
OPEN 1,DSK17
ERRXIT {CANT OPEN THE DSK: WORDS}
SETZM WORDSF+3
LOOKUP 1,WORDSF
ERRXIT {LOOKUP FAILED: WORDS}
HLRE AC1,WORDSF+3
HRRZ AC2,WORDS
AOS WORDS ;correct WORDS indirect ptr
HRRZM AC2,CMD
HRLM AC1,CMD
SUB AC2,AC1
HRRM AC2,INDEX ;set up INDEX indirect ptr
CALLI AC2,11 ;CORE
ERRXIT {CORE UUO FAILED: WORDS}
IN 1,CMD
JRST .+2
ERRXIT {IN UUO FAILED: WORDS}
RELEAS 1,
OPEN 1,DSK17
ERRXIT {CANT OPEN THE DSK: INDEX}
SETZM INDEXF+3
LOOKUP 1,INDEXF
ERRXIT {LOOKUP FAILED: INDEX}
HLRE AC1,INDEXF+3
HRRZ AC2,INDEX
AOS INDEX ;correct INDEX indirect ptr
HRRZM AC2,CMD
HRLM AC1,CMD
SUB AC2,AC1
HRRM AC2,USETBL ;set up USETBL indirect ptr
CALLI AC2,11 ;CORE
ERRXIT {CORE UUO FAILED: INDEX}
IN 1,CMD
JRST .+2
ERRXIT {IN UUO FAILED: INDEX}
RELEAS 1,
HRRZ AC2,USETBL
AOS USETBL ;correct USETBL indirect ptr
MOVE AC1,SLINKS
TRNE AC1,77
ADDI AC2,100
ASH AC1,-6
MOVEM AC1,TBLSIZ
SOS TBLSIZ
ADD AC2,AC1
HRRZM AC2,USEEND
CALLI AC2,11 ;CORE
ERRXIT {CORE UUO FAILED: USETBL}
HRRZ AC1,USETBL
HRLZI AC2,740000
MOVEM AC2,(AC1)
HRL AC1,AC1
ADDI AC1,1
BLT AC1,@USEEND
HRRZ AC2,USEEND
HRRM AC2,JOBFF
;Main loop.
SETZM MLTSTT
MOVEI MULT,-1
MOVEM MULT,MINMLT
SETZB DICTWD,USED#
NXTDWD: ADDI DICTWD,2
HLRZ AC1,@DICT
MOVE AC4,@WORDS
CAMN AC4,[77B6]
JRST MULTS
PUSHJ P,CKMLT
PUSHJ P,CKLNKS
JRST NXTDWD
MULTS: ADDI DICTWD,2
TRZE DICTWD,177
ADDI DICTWD,200
MOVEM DICTWD,MLTSTT
NXTMLT: PUSHJ P,CKMLT
HRRE MULT,@DICT+2
PUSHJ P,CKMLT2
PUSHJ P,CKLNKS
ADDI DICTWD,3
CHKREC: SKIPE @DICT
JRST NXTMLT
ADDI DICTWD,2
TRNN DICTWD,177
JRST CHKREC
;Final checks.
INSKIP ;TURN OFF ↑O
JFCL
MOVE AC1,MINMLT
MOVE ADR,LOCMIN
CAMGE AC1,MLTSTT
ERRMSG {MULT PTR POINTS TO MAIN PART OF DICT, NOT MULT PART},JRST .+1
PUSHJ P,MRKFRE ;MARK AVAIL SLOTS AND SEE IF ANY LEFT
;Mark all slots pointed to from INDEX.
OUTSTR [ASCIZ\
\]
HRRZ AC1,USETBL ;Clear Slot-use table
HRLZI AC2,740000
MOVEM AC2,(AC1)
HRL AC1,AC1
ADDI AC1,1
BLT AC1,@USEEND
SETZB DICTWD,USED
MOVE AC3,@INDEX ;PICK UP INDEX OF UNDUN ENTRY
MOVEM AC3,LSTSTY#
MOVEI DICTWD,2
MOVE DICTWD,@INDEX ;PICK UP INDEX OF OLD ENTRY
;"DICTWD" WILL NOW POINT INTO INDEX, "NEXT" INTO LINKS
NXSTY: HLRZ NEXT,@INDEX ;PICK UP BACK PTR FOR THIS STORY
JUMPE NEXT,NXSTY1
NXSTY2: HRRZ AC1,@LINKS+1 ;GET PTR FROM LINKS INTO INDEX
CAME AC1,DICTWD ;SHOULD POINT TO CURRENT STORY
ERRMSG {INCORRECT PTR FROM LINKS TO INDEX},JRST .+1
PUSHJ P,MARK ;MARK THIS SLOT USED
HLRZ NEXT,@LINKS+1 ;GET PTR TO NEXT SLOT FOR THIS STORY
JUMPN NEXT,NXSTY2
NXSTY1: ADDI DICTWD,XSIZE ;GET INDEX OF NEXT ENTRY IN INDEX
CAIL DICTWD,XLEN
MOVEI DICTWD,SPECS
CAME DICTWD,LSTSTY#
JRST NXSTY
INSKIP
JFCL
PUSHJ P,MRKFRE ;MARK AVAIL SLOTS AND SEE IF ANY LEFT
EXIT
;Subroutines: MARK,PRINT,ERROR.
MARK: LDB AC1,[POINT 12,NEXT,29] ;get adr of marking word
LDB AC2,[POINT 5,NEXT,34] ;get shift amount
MOVEI AC3,1
LSH AC3,(AC2)
MOVE AC4,AC3
AND AC4,@USETBL
JUMPE AC4,MOK ;was this link already marked used
ERRMSG {SLOT IN TWO LISTS},{POPJ P,}
MOK: ORM AC3,@USETBL ;no. marOk it now
AOS USED
POPJ P,
PRINT: MOVE BPTR,[POINT 7,DIGITS]
PUSHJ P,NXTDG
SETZ AC1,
IDPB AC1,BPTR
OUTSTR DIGITS
POPJ P,
NXTDG: IDIVI QUO,=10
PUSH P,REM
SKIPE QUO
PUSHJ P,NXTDG
COLLEC: POP P,AC1
ADDI AC1,60
IDPB AC1,BPTR
POPJ P,
ERROR: TLNE F,CON
JRST GOON
PUSH P,AC1
TLNE F,CONDDT
JRST TRYDDT
ERROR1: CLRBFI
OUTCHR ["←"]
INCHWL AC1
CLRBFI
CAIN AC1,LF
TLOA F,CON
CAIN AC1,CR
JRST ERREND
CAIE AC1,"X"
CAIN AC1,"x"
EXIT
CAIE AC1,"D"
CAIN AC1,"d"
JRST TRYDDT
CAIE AC1,200+"D" ;<CTRL> D
CAIN AC1,200+"d"
TLOA F,CONDDT ;GO INTO DDT AUTOMATICALLY FROM NOW ON
JRST ERROR1
TRYDDT: SKIPN JOBDDT
JRST NODDT
POP P,AC1
JSR $I
POPJ P,
NODDT: OUTSTR [ASCIZ \NO DDT\]
TLZ F,CONDDT
JRST ERROR1
ERREND: CLRBFI
POP P,AC1
TLNE F,CON
OUTCHR [CR]
POPJ P,
GOON: OUTSTR [ASCIZ\
\]
POPJ P,
;Subroutines: CKMLT,CKMLT2,CKLNKS.
CKMLT: HLRE MULT,@DICT+1 ;check MULT ptr for consistency
CKMLT2: JUMPE MULT,CPOPJ
JUMPG MULT,.+2
ERRMSG {NEGATIVE MULT PTR},{POPJ P,}
CAML MULT,SDICT
ERRMSG {MULT PTR OUT OF RANGE},{POPJ P,}
CAMLE MULT,MINMLT
JRST CKMLT1
CAML MULT,MINMLT
ERRMSG {TWO MULT PTRS POINT TO SAME MULT ENTRY},{POPJ P,}
MOVEM MULT,MINMLT
MOVEM DICTWD,LOCMIN
CKMLT1:
HLRE MULT1,@BACK
CAME MULT1,DICTWD
ERRMSG {INCORRECT BACK MULT PTR},JRST .+1
TRZ MULT,-200
IDIVI MULT,3
JUMPE MULT+1,CPOPJ
ERRMSG {MULT PTR NOT MULTIPLE OF 3},{POPJ P,}
CPOPJ: POPJ P,
CKLNKS: HRRZ NEXT,@DICT+1 ;check story list in LINKS for this keyword
JUMPE NEXT,CPOPJ ;zero means no stories contain this keyword
CAIN NEXT,-1 ;-1 means this is not a legal keyword
POPJ P,
CAML NEXT,SLINKS
ERRMSG {PTR FROM DICT TO LINKS IS OUT OF RANGE},{POPJ P,}
MOVNM DICTWD,LAST
NXTLNK: HRRE AC2,@LINKS
CAME AC2,LAST
ERRMSG {INCORRECT BACK PTR FOR DOUBLY LINKED LIST IN LINKS},{POPJ P,}
PUSHJ P,MARK
MOVE LAST,NEXT
HLRZ NEXT,@LINKS
CAML NEXT,SLINKS
ERRMSG {PTR TO NEXT SLOT IS OUT OF RANGE (SINGLE)},{POPJ P,}
JUMPN NEXT,NXTLNK
POPJ P,
;MRKFRE
MRKFRE: SETO CNT, ;mark free slots as "used"
SETZ NEXT,
NXTFRE: ADDI CNT,1
CAML NEXT,SLINKS
ERRMSG {PTR TO NEXT AVAIL SLOT IS OUT OF RANGE},JRST AOOR
PUSHJ P,MARK
MOVE NEXT,@LINKS
TLZE NEXT,-1
ERRMSG {NON-ZERO LEFT HALF OF AVAIL SLOT},JRST .+1
JUMPN NEXT,NXTFRE
AOOR: MOVEM CNT,FREE#
;Calculate locations of unreachable slots.
SETZ AC1,
NXTWD: AOSN AC2,@USETBL
JRST GETWD
SUBI AC2,1
SETCA AC2,
SETZ CNT,
JRST BOT
TOP: ADDI CNT,1(AC3)
LSH AC2,1(AC3)
MOVE ADR,AC1
ASH ADR,6
ADDI ADR,=72
SUB ADR,CNT
SUB ADR,CNT
CAMGE ADR,SLINKS
ERRMSG {LOST SLOT (ADR)},JRST .+1
BOT: JFFO AC2,TOP
GETWD: CAMGE AC1,TBLSIZ
AOJA AC1,NXTWD
CALLI 0 ;RESET PAGE PRINTER
OUTSTR [ASCIZ /
/]
MOVE QUO,FREE
PUSHJ P,PRINT
OUTSTR [ASCIZ / SLOTS LEFT IN AVAIL LIST
/]
MOVE QUO,USED
PUSHJ P,PRINT
OUTSTR [ASCIZ / SLOTS TOTAL
/]
POPJ P,
END CHK